#include "timer5_6.h"

/**
 * @desc  : 通用定时器初始化函数
 * @date  : 2025-02-14
 * @author: AnRui
 * @param :  timer_rcu - {参数说明}: 定時器时钟
 * @param :  timer - {参数说明}: 定時器
 * @param :  timer_param_psc - {参数说明}:预分频系数
 * @param :  timer_param_period - {参数说明}: 周期计数
 */
static void _timer_init(uint32_t timer_rcu, uint32_t timer, uint32_t timer_param_psc, uint32_t timer_param_period) {
    // 初始化定时器相关配置
    rcu_periph_clock_enable(timer_rcu);
    timer_deinit(timer);
    timer_parameter_struct tps;
    timer_struct_para_init(&tps);
    tps.prescaler = timer_param_psc;
    tps.period = timer_param_period;
    timer_init(timer, &tps);
    timer_interrupt_enable(timer, TIMER_INT_UP); // 向上计数 
}

/**
 * @desc  : 通用定时器启动函数
 * @date  : 2025-02-14
 * @author: AnRui
 * @param :  timer - {参数说明}: 定时器
 * @param :  timer_irq - {参数说明}: 定时器中断类型
 * @param :  nvic_pre_priority - {参数说明}: 抢占优先级
 * @param :  nvic_sub_priority - {参数说明}: 响应优先级
 */
static void timer_start(uint32_t timer, uint32_t timer_irq, uint32_t nvic_pre_priority, uint32_t nvic_sub_priority) {
    nvic_irq_enable(timer_irq, nvic_pre_priority, nvic_sub_priority); // 开启中断
    timer_enable(timer);   // 开启定时器
}

/**
 * @desc  : 通用定时器停止函数
 * @date  : 2025-02-14
 * @author: AnRui
 * @param :  timer - {参数说明}: 定时器
 * @param :  timer_irq - {参数说明}: 定时器中断
 */
static void timer_stop(uint32_t timer, uint32_t timer_irq) {
    nvic_irq_disable(timer_irq); // 停止计时器的时候 也要把 中断停止 要不然 不会及时停下来
    timer_interrupt_flag_clear(timer, TIMER_INT_FLAG_UP); // 清除中断标志位
    timer_disable(timer);
}

#if USE_TIMER5
/**
 * @desc  : timer5 基础定时器 初始化配置
 * @date  : 2025-02-14
* @author: AnRui
*/
static void timer5_init() {
    uint32_t timer_rcu = RCU_TIMER5;                   // 时钟信号
    uint32_t timer = TIMER5;                           //  哪个timer
    uint32_t timer_param_psc = TIMER5_PSC;       // 预分频系数
    uint32_t timer_param_period = TIMER5_PERIOD;  // 周期计数
    _timer_init(timer_rcu, timer, timer_param_psc, timer_param_period);
}

/**
 * @desc  : 开启timer5定时器
 * @date  : 2025-02-14
 * @author: AnRui
 */
void timer5_start() {
    timer_start(TIMER5, TIMER5_DAC_IRQn, TIMER5_NVIC_PRE_PRIORITY, TIMER5_NVIC_SUB_PRIORITY);
}

/**
 * @desc  : 关闭timer5定时器
 * @date  : 2025-02-14
 * @author: AnRui
 */
void timer5_stop() {
    timer_stop(TIMER5, TIMER5_DAC_IRQn);
}

/**
 * timer5中断函数
 */
void TIMER5_DAC_IRQHandler(void) {
    if (SET == timer_interrupt_flag_get(TIMER5, TIMER_INT_UP)) {
        timer5_irq_handler();
        // 清除中断标志位
        timer_interrupt_flag_clear(TIMER5, TIMER_INT_FLAG_UP);
    }
}
#endif

#if USE_TIMER6
/**
 * timer6 基础定时器
 * 只有内部定时功能
 */

static void timer6_init() {
    uint32_t timer_rcu = RCU_TIMER6;                   // 时钟信号
    uint32_t timer = TIMER6;                           //  哪个timer
    uint32_t timer_param_psc = TIMER6_PSC;       // 预分频系数
    uint32_t timer_param_period = TIMER6_PERIOD;        // 设置频率
    uint32_t timer_irq = TIMER6_IRQn;               // timer中断
    _timer_init(timer_rcu, timer, timer_param_psc, timer_param_period);
}

/**
 * @desc  : 开启timer6定时器
 * @date  : 2025-02-14
 * @author: AnRui
 */
void timer6_start() {
    timer_start(TIMER6, TIMER6_IRQn, TIMER6_NVIC_PRE_PRIORITY, TIMER6_NVIC_SUB_PRIORITY);
}

/**
 * @desc  : 关闭timer6定时器
 * @date  : 2025-02-14
 * @author: AnRui
 */
void timer6_stop() {
    timer_stop(TIMER6, TIMER6_IRQn);
}


/**
 * timer6中断函数
 */
void TIMER6_IRQHandler(void) {
    if (SET == timer_interrupt_flag_get(TIMER6, TIMER_INT_UP)) {
        timer6_irq_handler();
        // 清除中断标志位
        timer_interrupt_flag_clear(TIMER6, TIMER_INT_FLAG_UP);
    }

}
#endif

/**
 * @desc  : 基础定时器初始化
 * @date  : 2025-02-13
 * @author: AnRui
 */
void timer5_6_init() {
    rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4); // 全局倍频操作
#if USE_TIMER5
    timer5_init();
#endif
#if USE_TIMER6
    timer6_init();
#endif
}